<?php

namespace app\api\logic;

use app\common\exception\BusinessException;
use app\common\model\MaterialFile;
use app\common\model\MaterialShareFile;
use app\common\model\UserMaterial;
use app\common\service\UserService;
use think\facade\Db;

class Material
{
    /**
     * 查询列表
     * @param array $param
     * @return array
     * @throws
     */
    public function getList(array $param = []): array
    {

        // 提取参数
        $course_id = $param['course_id'];

        // 查询条件
        $where = [
            ['course_id', '=', $course_id],
            ['status', '=', 1],
        ];

        // 数据模型
        $materialModel = new MaterialFile();

        // 查询字段
        $field = 'id,name,version,price,hot';

        // 排序方式
        $order = ['hot' => 'desc'];

        // 查询数据
        $list = $materialModel->field($field)->where($where)->order($order)->select();

        // 填充数据
        foreach ($list as $key => $val) {
            //$list[$key]['count'] = rand(10000, 20000);
        }

        // 返回
        return $list ? $list->toArray() : [];
    }

    /**
     * 获取分享记录
     * @param $param
     * @return array
     */
    public function getShareList($param): array
    {
        // 提取参数
        $userId = $param['userId'];

        // 查询条件
        $where = [
            ['uid', '=', $userId],
        ];

        // 查询数据
        $field = 'a.id,a.content,a.create_time,a.opinion,a.status,b.name';
        $list = app(MaterialShareFile::class)
            ->alias('a')
            ->field($field)
            ->leftJoin('course b', 'a.course_id = b.id')
            ->where($where)
            ->limit(15)
            ->order('id', 'desc')
            ->select();
        $list = $list ? $list->toArray() : [];

        // 填充数据
        $statusDict = MaterialShareFile::$statusDict;
        foreach ($list as $key => $val) {
            $list[$key]['status_name'] = $statusDict[$val['status']] ?? '';
        }

        // 返回
        return $list;
    }

    /**
     * 查询信息
     * @param array $param
     * @return array
     * @throws
     */
    public function getInfo(array $param = []): array
    {
        // 提取参数
        $id = $param['id'];
        $userId = $param['userId'];

        // 查询条件
        $where = [
            ['id', '=', $id],
        ];

        // 数据模型
        $materialModel = new MaterialFile();

        // 查询字段
        $field = 'id,name,content,course_id,desc,price,hot,remote_url,version';

        // 查询数据
        $info = $materialModel->field($field)->where($where)->find();

        // 查询是否VIP
        $info['expire_text'] = '';
        $info['has_material'] = false;
        if ($info) {
            // 是否拥有资料
            $hasMaterial = (new UserMaterial())->getUserValidMaterial($userId, $id);
            if (!$hasMaterial) {
                $info['content'] = '';
                $info['remote_url'] = '';
            }

            // 填充有效期
            if ($hasMaterial) {
                $info['has_material'] = true;
                $info['expire_text'] = date('Y-m-d', $hasMaterial['expire']);
            }
        }

        // 返回
        return $info ? $info->toArray() : [];
    }

    /**
     * 获取远程地址
     * @param array $param
     * @return array
     * @throws
     */
    public function getRemoteUrl(array $param = []): array
    {
        // 提取参数
        $id = $param['id'];

        // 查询条件
        $where = [
            ['id', '=', $id],
        ];

        // 数据模型
        $materialModel = new MaterialFile();

        // 查询字段
        $field = 'id,name,desc,price,hot,remote_url';

        // 查询数据
        $info = $materialModel->field($field)->where($where)->find();

        // 返回
        return $info ? $info->toArray() : [];
    }

    /**
     * 购买资料
     * @param array $param
     * @throws
     */
    public function buy(array $param = [])
    {
        // 提取参数
        $id = $param['id'];
        $userId = $param['userId'];

        // 查询信息
        $materialModel = new MaterialFile();
        $info = $materialModel->find($id);
        if (!$info) {
            throw new BusinessException('资料不存在');
        }

        // 扣除积分+购买资料
        Db::transaction(function () use ($id, $userId, $info) {
            // 扣除积分
            $remark = '资料购买';
            (new UserService())->deductScoreToUid($userId, $info['price'], $remark);

            // 赠送资料
            $expire = 86400 * $info['expire'];
            (new UserMaterial())->setExpire($userId, $id, $expire);
        });
    }

    /**
     * shareRule
     * @return array
     */
    public function shareRule(): array
    {
        $ruleInfo = [
            'content' => <<<EOL
   为提高审核通过率请你备注资料来源和推荐理由，支持网盘链接，推荐提交视频资料，审核通过赠送500-1000积分，视频类资料赠送5000积分以上，有视频资料可以直接联系微信skr-web          
EOL,
            'shareContentTip' => <<<EOL
  请填上推荐理由，资料下载地址(推荐提交视频资料)，禁止分享侵权文件。  
EOL,

        ];
        return $ruleInfo;
    }


    /**
     * shareSave
     * @param $param
     * @throws BusinessException
     */
    public function shareSave($param)
    {
        // 提取参数
        $course_id = $param['course_id'];
        $userId = $param['userId'];
        $content = trim($param['content']);

        // 检查数据
        $model = new MaterialShareFile();

        // 查询条件
        $where = [
            'uid' => $userId,
            'course_id' => $course_id,
            'content' => $content,
        ];
        $count = $model->where($where)->count();
        if ($count) {
            throw new BusinessException('您已经提交成功');
        }

        // 提交数据
        $saveData = [
            'uid' => $userId,
            'course_id' => $course_id,
            'content' => $content,
        ];
        $isAdd = $model->add_data($saveData);
        if (!$isAdd) {
            throw new BusinessException('提交数据失败');
        }
    }
}